package servlets;

import beans.EncuestaBean;
import com.mysql.jdbc.exceptions.MySQLIntegrityConstraintViolationException;
import com.sun.org.apache.xerces.internal.impl.dv.util.Base64;
import databeans.EncuestaDataBean;
import databeans.VotoDataBean;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.servlet.ServletConfig;
import utils.CargarConfiguraciones;


/**
 *
 * @author Carlos, Eduardo
 */
public class VotarEncuesta extends HttpServlet {

    private Connection conexion;
    private Statement instruccion;

    //Establecer la conexion con la base de datos
    @Override
    public void init (ServletConfig config) throws ServletException{

    //Intentar la conexion y crear instrucciones
        try{
        CargarConfiguraciones cc = new CargarConfiguraciones();
        Class.forName(cc.getValor("driver"));
        conexion =  DriverManager.getConnection(cc.getValor("urlbase"),
                    cc.getValor("usuario"),
                    cc.getValor("clave"));
        //Crear la instruccion
        instruccion = conexion.createStatement();
        }catch(Exception e){
            e.printStackTrace();
        }//end catch
    }

    /**
     * Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {

//        response.setContentType("text/plain");
        response.setCharacterEncoding("UTF-8");
        response.setHeader("Content-Type", "application/octet-stream");
        response.setHeader("Connection", "Keep-Alive");
        PrintWriter out = response.getWriter();
        ResultSet maxRespuestasRS;
        try {
            //leer los parametros enviados:
            //id - id de la encuesta
            //num - Numero de telefono de origen
            //respuesta - Respuesta a la encuesta

            String id=request.getParameter("id");
            String numero = Base64.encode(request.getParameter("numero").getBytes());
            String respuesta = request.getParameter("respuesta");
            String carnet="Inicial";

            EncuestaDataBean edb = new EncuestaDataBean();
            VotoDataBean vdb = new VotoDataBean();
            //Intentar procesar el voto
            boolean inscritoMateria = true;
            String sql = null;
            if(edb.existeCodigo(id)){ // si existe la encuesta
                //obtener los datos de la encuesta
                EncuestaBean encuesta = edb.getEncuesta(id);

                //Obtener el carnet de la persona a partir del numero
                sql = "SELECT carnet from alumno where telefono='"+numero+"'";
                System.out.println(sql);
                ResultSet carnetRS = instruccion.executeQuery(sql);
                carnetRS.next();//Moverlo al primer registro
                carnet = carnetRS.getString(1);

                if(encuesta.getMateria()!=null){ // si la encuesta tiene materia
                    sql = "SELECT count(*) FROM alumno_materia WHERE codmateria = '" + encuesta.getMateria() + "' and carnet = '" + carnet + "'";
                    System.out.println(sql);
                    maxRespuestasRS = instruccion.executeQuery(sql);
                    maxRespuestasRS.next();
                    if(maxRespuestasRS.getInt(1)< 1){ // si no pertenece a la materia
                       inscritoMateria = false;
                    }
                }

                if(inscritoMateria && vdb.puedeVotar(encuesta.getIdEncuesta(), carnet)) {//si aun puede votar
                    if (Integer.parseInt(respuesta)<= vdb.conteoOpciones(id)) // si el voto es valido
                    {
                        //Ingresar el voto
                        sql = "insert into detalleencuesta(idencuesta, carnet, respuesta) ";
                        sql += "values('"+id+"','"+carnet+"','"+respuesta+"')";
                        System.out.println(sql);
                        instruccion.execute(sql);

                        //notificar que el voto ha sido ingresado
                        out.print("Voto ingresado");
                        out.flush();
                        out.close();
                    } else
                        System.out.println("Voto invalido");
    //            else
    //            {
    //                out.print("Ha alcanzado el maximo de votos para esta encuesta");
    //                out.flush();
    //                out.close();
    //            }
                } else
                    System.out.println("No esta insrito en la materia y/o no puede seguir votando");
            } else
                System.out.println("Encuesta invalida");
            response.setStatus(HttpServletResponse.SC_OK);

    }// if database exception occurs, return error page
    catch (MySQLIntegrityConstraintViolationException sqlException )
    {
        System.err.println("La opción ingresada no es válida");
        sqlException.printStackTrace();
    } 
    catch(Exception sqlExcepcion)
    {
        sqlExcepcion.printStackTrace();
    } // end catch
}




    @Override
    public void destroy()
    {

        try{
            instruccion.close();
            conexion.close();

        }
        catch(SQLException exc)
        {
            exc.printStackTrace();
        }

    }

    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /**
     * Handles the HTTP <code>GET</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Handles the HTTP <code>POST</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Returns a short description of the servlet.
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>

}
